// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "Abilities/GameplayAbility.h"
#include "InteractionOption.h"
#include "IInteractableTarget.generated.h"

struct FInteractionQuery;

/**
 * 交互选项构建器类，用于构建交互选项列表
 */
class FInteractionOptionBuilder
{
public:
	FInteractionOptionBuilder(TScriptInterface<IInteractableTarget> InterfaceTargetScope, TArray<FInteractionOption>& InteractOptions)
		: Scope(InterfaceTargetScope)
		, Options(InteractOptions)
	{
	}

	/**
	 * 添加交互选项到列表中
	 * @param Option 要添加的交互选项
	 */
	void AddInteractionOption(const FInteractionOption& Option)
	{
		FInteractionOption& OptionEntry = Options.Add_GetRef(Option);
		OptionEntry.InteractableTarget = Scope; // 设置交互选项的交互目标
	}

private:
	TScriptInterface<IInteractableTarget> Scope; // 交互目标接口
	TArray<FInteractionOption>& Options; // 交互选项列表引用
};

/**
 * 可交互目标接口的UInterface定义
 */
UINTERFACE(MinimalAPI, meta = (CannotImplementInterfaceInBlueprint))
class UInteractableTarget : public UInterface
{
	GENERATED_BODY()
};

/**
 * 可交互目标接口，定义可交互对象需要实现的功能
 */
class IInteractableTarget
{
	GENERATED_BODY()

public:
	/**
	 * 收集交互选项，纯虚函数，必须在派生类中实现
	 * @param InteractQuery 交互查询参数
	 * @param OptionBuilder 交互选项构建器
	 */
	virtual void GatherInteractionOptions(const FInteractionQuery& InteractQuery, FInteractionOptionBuilder& OptionBuilder) = 0;

	/**
	 * 自定义交互事件数据，虚函数，可选择在派生类中重写
	 * @param InteractionEventTag 交互事件标签
	 * @param InOutEventData 输入输出的游戏事件数据
	 */
	virtual void CustomizeInteractionEventData(const FGameplayTag& InteractionEventTag, FGameplayEventData& InOutEventData) { }
};